home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / idlelib / IOBinding.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2008-10-29  |  17.1 KB  |  625 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import os
  5. import types
  6. import sys
  7. import codecs
  8. import tempfile
  9. import tkFileDialog
  10. import tkMessageBox
  11. import re
  12. from Tkinter import *
  13. from SimpleDialog import SimpleDialog
  14. from configHandler import idleConf
  15.  
  16. try:
  17.     from codecs import BOM_UTF8
  18. except ImportError:
  19.     BOM_UTF8 = '\xef\xbb\xbf'
  20.  
  21.  
  22. try:
  23.     import locale
  24.     locale.setlocale(locale.LC_CTYPE, '')
  25. except (ImportError, locale.Error):
  26.     pass
  27.  
  28. filesystemencoding = sys.getfilesystemencoding()
  29. encoding = 'ascii'
  30. if sys.platform == 'win32':
  31.     
  32.     try:
  33.         encoding = locale.getdefaultlocale()[1]
  34.         codecs.lookup(encoding)
  35.     except LookupError:
  36.         pass
  37.  
  38. else:
  39.     
  40.     try:
  41.         encoding = locale.nl_langinfo(locale.CODESET)
  42.         if encoding is None or encoding is '':
  43.             encoding = 'ascii'
  44.         
  45.         codecs.lookup(encoding)
  46.     except (NameError, AttributeError, LookupError):
  47.         
  48.         try:
  49.             encoding = locale.getdefaultlocale()[1]
  50.             if encoding is None or encoding is '':
  51.                 encoding = 'ascii'
  52.             
  53.             codecs.lookup(encoding)
  54.         except (ValueError, LookupError):
  55.             pass
  56.  
  57.  
  58. encoding = encoding.lower()
  59. coding_re = re.compile('coding[:=]\\s*([-\\w_.]+)')
  60.  
  61. class EncodingMessage(SimpleDialog):
  62.     '''Inform user that an encoding declaration is needed.'''
  63.     
  64.     def __init__(self, master, enc):
  65.         self.should_edit = False
  66.         self.root = top = Toplevel(master)
  67.         top.bind('<Return>', self.return_event)
  68.         top.bind('<Escape>', self.do_ok)
  69.         top.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
  70.         top.wm_title('I/O Warning')
  71.         top.wm_iconname('I/O Warning')
  72.         self.top = top
  73.         l1 = Label(top, text = 'Non-ASCII found, yet no encoding declared. Add a line like')
  74.         l1.pack(side = TOP, anchor = W)
  75.         l2 = Entry(top, font = 'courier')
  76.         l2.insert(0, '# -*- coding: %s -*-' % enc)
  77.         l2.pack(side = TOP, anchor = W, fill = X)
  78.         l3 = Label(top, text = 'to your file\nChoose OK to save this file as %s\nEdit your general options to silence this warning' % enc)
  79.         l3.pack(side = TOP, anchor = W)
  80.         buttons = Frame(top)
  81.         buttons.pack(side = TOP, fill = X)
  82.         self.default = self.cancel = 0
  83.         b1 = Button(buttons, text = 'Ok', default = 'active', command = self.do_ok)
  84.         b1.pack(side = LEFT, fill = BOTH, expand = 1)
  85.         b2 = Button(buttons, text = 'Edit my file', command = self.do_edit)
  86.         b2.pack(side = LEFT, fill = BOTH, expand = 1)
  87.         self._set_transient(master)
  88.  
  89.     
  90.     def do_ok(self):
  91.         self.done(0)
  92.  
  93.     
  94.     def do_edit(self):
  95.         self.done(1)
  96.  
  97.  
  98.  
  99. def coding_spec(str):
  100.     '''Return the encoding declaration according to PEP 263.
  101.  
  102.     Raise LookupError if the encoding is declared but unknown.
  103.     '''
  104.     str = str.split('\n')[:2]
  105.     str = '\n'.join(str)
  106.     match = coding_re.search(str)
  107.     if not match:
  108.         return None
  109.     
  110.     name = match.group(1)
  111.     import codecs
  112.     
  113.     try:
  114.         codecs.lookup(name)
  115.     except LookupError:
  116.         raise LookupError, 'Unknown encoding ' + name
  117.  
  118.     return name
  119.  
  120.  
  121. class IOBinding:
  122.     
  123.     def __init__(self, editwin):
  124.         self.editwin = editwin
  125.         self.text = editwin.text
  126.         self._IOBinding__id_open = self.text.bind('<<open-window-from-file>>', self.open)
  127.         self._IOBinding__id_save = self.text.bind('<<save-window>>', self.save)
  128.         self._IOBinding__id_saveas = self.text.bind('<<save-window-as-file>>', self.save_as)
  129.         self._IOBinding__id_savecopy = self.text.bind('<<save-copy-of-window-as-file>>', self.save_a_copy)
  130.         self.fileencoding = None
  131.         self._IOBinding__id_print = self.text.bind('<<print-window>>', self.print_window)
  132.  
  133.     
  134.     def close(self):
  135.         self.text.unbind('<<open-window-from-file>>', self._IOBinding__id_open)
  136.         self.text.unbind('<<save-window>>', self._IOBinding__id_save)
  137.         self.text.unbind('<<save-window-as-file>>', self._IOBinding__id_saveas)
  138.         self.text.unbind('<<save-copy-of-window-as-file>>', self._IOBinding__id_savecopy)
  139.         self.text.unbind('<<print-window>>', self._IOBinding__id_print)
  140.         self.editwin = None
  141.         self.text = None
  142.         self.filename_change_hook = None
  143.  
  144.     
  145.     def get_saved(self):
  146.         return self.editwin.get_saved()
  147.  
  148.     
  149.     def set_saved(self, flag):
  150.         self.editwin.set_saved(flag)
  151.  
  152.     
  153.     def reset_undo(self):
  154.         self.editwin.reset_undo()
  155.  
  156.     filename_change_hook = None
  157.     
  158.     def set_filename_change_hook(self, hook):
  159.         self.filename_change_hook = hook
  160.  
  161.     filename = None
  162.     dirname = None
  163.     
  164.     def set_filename(self, filename):
  165.         if filename and os.path.isdir(filename):
  166.             self.filename = None
  167.             self.dirname = filename
  168.         else:
  169.             self.filename = filename
  170.             self.dirname = None
  171.             self.set_saved(1)
  172.             if self.filename_change_hook:
  173.                 self.filename_change_hook()
  174.             
  175.  
  176.     
  177.     def open(self, event = None, editFile = None):
  178.         if self.editwin.flist:
  179.             if not editFile:
  180.                 filename = self.askopenfile()
  181.             else:
  182.                 filename = editFile
  183.             if filename:
  184.                 
  185.                 try:
  186.                     interp = self.editwin.interp
  187.                 except:
  188.                     interp = None
  189.  
  190.                 if not (self.filename) and self.get_saved() and not interp:
  191.                     self.editwin.flist.open(filename, self.loadfile)
  192.                 else:
  193.                     self.editwin.flist.open(filename)
  194.             else:
  195.                 self.text.focus_set()
  196.             return 'break'
  197.         
  198.         if self.get_saved():
  199.             reply = self.maybesave()
  200.             if reply == 'cancel':
  201.                 self.text.focus_set()
  202.                 return 'break'
  203.             
  204.         
  205.         if not editFile:
  206.             filename = self.askopenfile()
  207.         else:
  208.             filename = editFile
  209.         if filename:
  210.             self.loadfile(filename)
  211.         else:
  212.             self.text.focus_set()
  213.         return 'break'
  214.  
  215.     eol = '(\\r\\n)|\\n|\\r'
  216.     eol_re = re.compile(eol)
  217.     eol_convention = os.linesep
  218.     
  219.     def loadfile(self, filename):
  220.         
  221.         try:
  222.             f = open(filename, 'rb')
  223.             chars = f.read()
  224.             f.close()
  225.         except IOError:
  226.             msg = None
  227.             tkMessageBox.showerror('I/O Error', str(msg), master = self.text)
  228.             return False
  229.  
  230.         chars = self.decode(chars)
  231.         firsteol = self.eol_re.search(chars)
  232.         if firsteol:
  233.             self.eol_convention = firsteol.group(0)
  234.             if isinstance(self.eol_convention, unicode):
  235.                 self.eol_convention = self.eol_convention.encode('ascii')
  236.             
  237.             chars = self.eol_re.sub('\\n', chars)
  238.         
  239.         self.text.delete('1.0', 'end')
  240.         self.set_filename(None)
  241.         self.text.insert('1.0', chars)
  242.         self.reset_undo()
  243.         self.set_filename(filename)
  244.         self.text.mark_set('insert', '1.0')
  245.         self.text.see('insert')
  246.         self.updaterecentfileslist(filename)
  247.         return True
  248.  
  249.     
  250.     def decode(self, chars):
  251.         '''Create a Unicode string
  252.  
  253.         If that fails, let Tcl try its best
  254.         '''
  255.         if chars.startswith(BOM_UTF8):
  256.             
  257.             try:
  258.                 chars = chars[3:].decode('utf-8')
  259.             except UnicodeError:
  260.                 return chars
  261.  
  262.             self.fileencoding = BOM_UTF8
  263.             return chars
  264.         
  265.         
  266.         try:
  267.             enc = coding_spec(chars)
  268.         except LookupError:
  269.             name = None
  270.             tkMessageBox.showerror(title = 'Error loading the file', message = "The encoding '%s' is not known to this Python installation. The file may not display correctly" % name, master = self.text)
  271.             enc = None
  272.  
  273.         if enc:
  274.             
  275.             try:
  276.                 return unicode(chars, enc)
  277.             except UnicodeError:
  278.                 pass
  279.             except:
  280.                 None<EXCEPTION MATCH>UnicodeError
  281.             
  282.  
  283.         None<EXCEPTION MATCH>UnicodeError
  284.         
  285.         try:
  286.             return unicode(chars, 'ascii')
  287.         except UnicodeError:
  288.             pass
  289.  
  290.         
  291.         try:
  292.             chars = unicode(chars, encoding)
  293.             self.fileencoding = encoding
  294.         except UnicodeError:
  295.             pass
  296.  
  297.         return chars
  298.  
  299.     
  300.     def maybesave(self):
  301.         if self.get_saved():
  302.             return 'yes'
  303.         
  304.         if not self.filename:
  305.             pass
  306.         message = 'Do you want to save %s before closing?' % 'this untitled document'
  307.         m = tkMessageBox.Message(title = 'Save On Close', message = message, icon = tkMessageBox.QUESTION, type = tkMessageBox.YESNOCANCEL, master = self.text)
  308.         reply = m.show()
  309.         if reply == 'yes':
  310.             self.save(None)
  311.             if not self.get_saved():
  312.                 reply = 'cancel'
  313.             
  314.         
  315.         self.text.focus_set()
  316.         return reply
  317.  
  318.     
  319.     def save(self, event):
  320.         if not self.filename:
  321.             self.save_as(event)
  322.         elif self.writefile(self.filename):
  323.             self.set_saved(1)
  324.             
  325.             try:
  326.                 self.editwin.store_file_breaks()
  327.             except AttributeError:
  328.                 pass
  329.             except:
  330.                 None<EXCEPTION MATCH>AttributeError
  331.             
  332.  
  333.         None<EXCEPTION MATCH>AttributeError
  334.         self.text.focus_set()
  335.         return 'break'
  336.  
  337.     
  338.     def save_as(self, event):
  339.         filename = self.asksavefile()
  340.         if filename:
  341.             if self.writefile(filename):
  342.                 self.set_filename(filename)
  343.                 self.set_saved(1)
  344.                 
  345.                 try:
  346.                     self.editwin.store_file_breaks()
  347.                 except AttributeError:
  348.                     pass
  349.                 except:
  350.                     None<EXCEPTION MATCH>AttributeError
  351.                 
  352.  
  353.             None<EXCEPTION MATCH>AttributeError
  354.         
  355.         self.text.focus_set()
  356.         self.updaterecentfileslist(filename)
  357.         return 'break'
  358.  
  359.     
  360.     def save_a_copy(self, event):
  361.         filename = self.asksavefile()
  362.         if filename:
  363.             self.writefile(filename)
  364.         
  365.         self.text.focus_set()
  366.         self.updaterecentfileslist(filename)
  367.         return 'break'
  368.  
  369.     
  370.     def writefile(self, filename):
  371.         self.fixlastline()
  372.         chars = self.encode(self.text.get('1.0', 'end-1c'))
  373.         if self.eol_convention != '\n':
  374.             chars = chars.replace('\n', self.eol_convention)
  375.         
  376.         
  377.         try:
  378.             f = open(filename, 'wb')
  379.             f.write(chars)
  380.             f.flush()
  381.             f.close()
  382.             return True
  383.         except IOError:
  384.             msg = None
  385.             tkMessageBox.showerror('I/O Error', str(msg), master = self.text)
  386.             return False
  387.  
  388.  
  389.     
  390.     def encode(self, chars):
  391.         if isinstance(chars, types.StringType):
  392.             return chars
  393.         
  394.         
  395.         try:
  396.             return chars.encode('ascii')
  397.         except UnicodeError:
  398.             pass
  399.  
  400.         
  401.         try:
  402.             enc = coding_spec(chars)
  403.             failed = None
  404.         except LookupError:
  405.             msg = None
  406.             failed = msg
  407.             enc = None
  408.  
  409.         if enc:
  410.             
  411.             try:
  412.                 return chars.encode(enc)
  413.             except UnicodeError:
  414.                 failed = "Invalid encoding '%s'" % enc
  415.             except:
  416.                 None<EXCEPTION MATCH>UnicodeError
  417.             
  418.  
  419.         None<EXCEPTION MATCH>UnicodeError
  420.         if failed:
  421.             tkMessageBox.showerror('I/O Error', '%s. Saving as UTF-8' % failed, master = self.text)
  422.         
  423.         if self.fileencoding == BOM_UTF8 or failed:
  424.             return BOM_UTF8 + chars.encode('utf-8')
  425.         
  426.         if self.fileencoding:
  427.             
  428.             try:
  429.                 return chars.encode(self.fileencoding)
  430.             except UnicodeError:
  431.                 tkMessageBox.showerror('I/O Error', "Cannot save this as '%s' anymore. Saving as UTF-8" % self.fileencoding, master = self.text)
  432.                 return BOM_UTF8 + chars.encode('utf-8')
  433.             except:
  434.                 None<EXCEPTION MATCH>UnicodeError
  435.             
  436.  
  437.         None<EXCEPTION MATCH>UnicodeError
  438.         config_encoding = idleConf.GetOption('main', 'EditorWindow', 'encoding')
  439.         if config_encoding == 'utf-8':
  440.             return BOM_UTF8 + chars.encode('utf-8')
  441.         
  442.         ask_user = True
  443.         
  444.         try:
  445.             chars = chars.encode(encoding)
  446.             enc = encoding
  447.             if config_encoding == 'locale':
  448.                 ask_user = False
  449.         except UnicodeError:
  450.             chars = BOM_UTF8 + chars.encode('utf-8')
  451.             enc = 'utf-8'
  452.  
  453.         if not ask_user:
  454.             return chars
  455.         
  456.         dialog = EncodingMessage(self.editwin.top, enc)
  457.         dialog.go()
  458.         if dialog.num == 1:
  459.             encline = '# -*- coding: %s -*-\n' % enc
  460.             firstline = self.text.get('1.0', '2.0')
  461.             if firstline.startswith('#!'):
  462.                 self.text.insert('2.0', encline)
  463.             else:
  464.                 self.text.insert('1.0', encline)
  465.             return self.encode(self.text.get('1.0', 'end-1c'))
  466.         
  467.         return chars
  468.  
  469.     
  470.     def fixlastline(self):
  471.         c = self.text.get('end-2c')
  472.         if c != '\n':
  473.             self.text.insert('end-1c', '\n')
  474.         
  475.  
  476.     
  477.     def print_window(self, event):
  478.         tempfilename = None
  479.         saved = self.get_saved()
  480.         if saved:
  481.             filename = self.filename
  482.         
  483.         if not saved or filename is None:
  484.             (tfd, tempfilename) = tempfile.mkstemp(prefix = 'IDLE_tmp_')
  485.             filename = tempfilename
  486.             os.close(tfd)
  487.             if not self.writefile(tempfilename):
  488.                 os.unlink(tempfilename)
  489.                 return 'break'
  490.             
  491.         
  492.         platform = os.name
  493.         printPlatform = 1
  494.         if platform == 'posix':
  495.             command = idleConf.GetOption('main', 'General', 'print-command-posix')
  496.             command = command + ' 2>&1'
  497.         elif platform == 'nt':
  498.             command = idleConf.GetOption('main', 'General', 'print-command-win')
  499.         else:
  500.             printPlatform = 0
  501.         if printPlatform:
  502.             command = command % filename
  503.             pipe = os.popen(command, 'r')
  504.             output = pipe.read().strip()
  505.             status = pipe.close()
  506.             if status:
  507.                 output = 'Printing failed (exit status 0x%x)\n' % status + output
  508.             
  509.             if output:
  510.                 output = 'Printing command: %s\n' % repr(command) + output
  511.                 tkMessageBox.showerror('Print status', output, master = self.text)
  512.             
  513.         else:
  514.             message = 'Printing is not enabled for this platform: %s' % platform
  515.             tkMessageBox.showinfo('Print status', message, master = self.text)
  516.         if tempfilename:
  517.             os.unlink(tempfilename)
  518.         
  519.         return 'break'
  520.  
  521.     opendialog = None
  522.     savedialog = None
  523.     filetypes = [
  524.         ('Python and text files', '*.py *.pyw *.txt', 'TEXT'),
  525.         ('All text files', '*', 'TEXT'),
  526.         ('All files', '*')]
  527.     
  528.     def askopenfile(self):
  529.         (dir, base) = self.defaultfilename('open')
  530.         if not self.opendialog:
  531.             self.opendialog = tkFileDialog.Open(master = self.text, filetypes = self.filetypes)
  532.         
  533.         filename = self.opendialog.show(initialdir = dir, initialfile = base)
  534.         if isinstance(filename, unicode):
  535.             filename = filename.encode(filesystemencoding)
  536.         
  537.         return filename
  538.  
  539.     
  540.     def defaultfilename(self, mode = 'open'):
  541.         if self.filename:
  542.             return os.path.split(self.filename)
  543.         elif self.dirname:
  544.             return (self.dirname, '')
  545.         else:
  546.             
  547.             try:
  548.                 pwd = os.getcwd()
  549.             except os.error:
  550.                 pwd = ''
  551.  
  552.             return (pwd, '')
  553.  
  554.     
  555.     def asksavefile(self):
  556.         (dir, base) = self.defaultfilename('save')
  557.         if not self.savedialog:
  558.             self.savedialog = tkFileDialog.SaveAs(master = self.text, filetypes = self.filetypes)
  559.         
  560.         filename = self.savedialog.show(initialdir = dir, initialfile = base)
  561.         if isinstance(filename, unicode):
  562.             filename = filename.encode(filesystemencoding)
  563.         
  564.         return filename
  565.  
  566.     
  567.     def updaterecentfileslist(self, filename):
  568.         '''Update recent file list on all editor windows'''
  569.         self.editwin.update_recent_files_list(filename)
  570.  
  571.  
  572.  
  573. def test():
  574.     root = Tk()
  575.     
  576.     class MyEditWin:
  577.         
  578.         def __init__(self, text):
  579.             self.text = text
  580.             self.flist = None
  581.             self.text.bind('<Control-o>', self.open)
  582.             self.text.bind('<Control-s>', self.save)
  583.             self.text.bind('<Alt-s>', self.save_as)
  584.             self.text.bind('<Alt-z>', self.save_a_copy)
  585.  
  586.         
  587.         def get_saved(self):
  588.             return 0
  589.  
  590.         
  591.         def set_saved(self, flag):
  592.             pass
  593.  
  594.         
  595.         def reset_undo(self):
  596.             pass
  597.  
  598.         
  599.         def open(self, event):
  600.             self.text.event_generate('<<open-window-from-file>>')
  601.  
  602.         
  603.         def save(self, event):
  604.             self.text.event_generate('<<save-window>>')
  605.  
  606.         
  607.         def save_as(self, event):
  608.             self.text.event_generate('<<save-window-as-file>>')
  609.  
  610.         
  611.         def save_a_copy(self, event):
  612.             self.text.event_generate('<<save-copy-of-window-as-file>>')
  613.  
  614.  
  615.     text = Text(root)
  616.     text.pack()
  617.     text.focus_set()
  618.     editwin = MyEditWin(text)
  619.     io = IOBinding(editwin)
  620.     root.mainloop()
  621.  
  622. if __name__ == '__main__':
  623.     test()
  624.  
  625.